#include <iostream>
using namespace std;

/*
	父类的同名方法不是虚函数(普通函数)
	   1.规则：编译器严格按照赋值运算左边的类型去调用对应的f方法
	     老外把这个规定取了专业术语：叫做静态联编
	   2.C++规定：父类的指针或者引用可以直接指向不同子类，不需要写强制类型转换
	     但是反过来，子类的指针指向父类的地址，必须强制类型转换
*/
class B
{
public:
	void f()
	{
		cout<<"父类的f方法"<<endl;
	}
};

class D:public B
{
public:
	void f()
	{
		cout<<"子类的f方法"<<endl;
	}	
};

int main()
{
	B b;
	B *pb;
	D d;
	D *pd;
	
	//父类指针指向父类对象
	pb=&b;    //不是虚函数，看左边类型
	pb->f();  //调用父类的f
	
	//父类指针指向子类对象
	pb=&d;   //不是虚函数，看左边类型
	pb->f(); //调用父类的f 
	
	//子类指针指向父类对象
	pd=(D *)(&b);  //不是虚函数，看左边类型
	pd->f(); //调用子类的f
	
	//子类指针指向子类对象
	pd=&d;    //不是虚函数，看左边类型
	pd->f(); //调用子类的f
	return 0;
}